package com.woniuxy.amusementparkos.controller.lsy;
/**
* @author Muzi
* 腕带类型管理控制器
* 2020年4月27日下午8:42:31
*/

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.woniuxy.amusementparkos.dto.lvd.TableDataDto;
import com.woniuxy.amusementparkos.entity.lsy.ConsumerItem;
import com.woniuxy.amusementparkos.entity.lsy.WriststrpType;
import com.woniuxy.amusementparkos.service.lsy.WriststrpTypeService;
import com.woniuxy.amusementparkos.service.wyh.WristStrap_RepositoryService;

import lombok.extern.slf4j.Slf4j;

@Controller
@RequestMapping("/wriststrpType")
@Slf4j
public class WriststrpTypeController {
	// 注入服务实现类对象
	@Autowired
	private WriststrpTypeService wriststrpTypeService;
	
	
	// 注入腕带仓库服务
	@Autowired
	private WristStrap_RepositoryService wRService;
	
	@ResponseBody
	@RequestMapping("/deleteOne")
	public TableDataDto<WriststrpType> deleteWriststrpType(Integer type_id){
		TableDataDto<WriststrpType> result = new TableDataDto<>();
		// 删除之前先进行从表腕带仓库中查询，是否还存在使用即将删除类型的腕带。
		Integer nums = wRService.countWristStrapByType(type_id);
		if(nums>0) {
			// 设置响应操作码
			result.setCode(2);
			// 设置提示信息
			result.setMsg("删除失败！腕带仓库中正在使用当前类型，请先修改仓库中的腕带后，再重试。");
			// 记录日志
			log.warn("错误：尝试删除腕带仓库中已存在的类型的腕带类型");
			return result;
		}
		try {
			wriststrpTypeService.deleteWriststrpType(type_id);
		} catch (RuntimeException e) {
			// 设置响应操作码
			result.setCode(4);
			// 设置提示信息
			result.setMsg("删除失败！，请检查提交的数据，或尝试联系管理员");
			// 记录日志
			log.warn("WriststrpTypeController的deleteWriststrpType操作发生异常："+e);
			return result;
		}
		// 记录日志
		log.info("删除腕带类型成功，被删除的腕带类型编号为："+type_id);
		// 设置成功操作响应
		result.setCode(1);
		result.setMsg("删除成功");
		return result;
	}
	
	
	/**
	 * 更新腕带类型的方法
	 * @param wriststrpType 腕带类型数据（不含消费项）
	 * @param itemstr 消费项主键的字符串
	 * @return 返回 处理结果信息msg，和网页名等
	 */
	@ResponseBody
	@RequestMapping("/updateOne")
	public TableDataDto<WriststrpType> updateWriststrpType(WriststrpType wriststrpType,String itemstr){
		// 调用解析方法，解析字符为消费项对象
		List<ConsumerItem> items = consumerItemHandler(itemstr);
		// 设置腕带类型的数据值
		wriststrpType.setItems(items);
		// 创建处理结果的对象
		TableDataDto<WriststrpType> result = new TableDataDto<>();
		try {
			// 调用service，捕获方法
			wriststrpTypeService.updateWriststrpType(wriststrpType);
		} catch (RuntimeException e) {
			// 设置响应操作码
			result.setCode(4);
			// 设置提示信息
			result.setMsg("修改失败！，请检查提交的数据，或尝试联系管理员");
			// 记录异常日志
			log.warn("WriststrpTypeController的updateWriststrpType操作发生异常："+e);
			return result;	
		}
		// 记录正常操作的日志
		log.info("更新腕带类型成功，更新后的腕带类型为："+wriststrpType);
		// 以下是操作成功的设置
		result.setCode(1);
		result.setMsg("修改成功");
		return result;
	}
	

	/**
	 * 添加腕带类型控制器
	 * @param wriststrpType 腕带类型 数据
	 * @param itemstr  消费项的id字符串
	 * @return
	 */
	@ResponseBody
	@RequestMapping("/insertOne")
	public TableDataDto<WriststrpType> insertWriststrpType(WriststrpType wriststrpType,String itemstr){
		// 调用字符解析封装方法
		List<ConsumerItem> items = consumerItemHandler(itemstr);
		// 解析后设置消费项
		wriststrpType.setItems(items);
		// 创建结果对象
		TableDataDto<WriststrpType> result = new TableDataDto<>();
		try {
			// 调用service,并捕获异常
			wriststrpTypeService.insertWriststrpType(wriststrpType);
		} catch (RuntimeException e) {
			// 设置响应操作码
			result.setCode(4);
			// 设置提示信息
			result.setMsg("添加失败！，请检查提交的数据，或尝试联系管理员");
			// 记录异常日志
			log.warn("WriststrpTypeController的insertWriststrpType操作发生异常："+e);
			return result;
		}
		// 记录正常操作日志
		log.info("新增腕带类型成功，新增的是："+wriststrpType);
		// 设置响应操作码
		result.setCode(1);
		// 设置提示信息
		result.setMsg("添加成功");
		return result;
	}
	
	/**
	 * 查询所有腕带类型的控制器
	 * @return 封装数据
	 */
	@ResponseBody
	@RequestMapping("/getall")
	public TableDataDto<WriststrpType> listAllWriststrpType(){
		// 创建数据封装类
		TableDataDto<WriststrpType> result = new TableDataDto<>();
		// 执行查询 获得结果
		List<WriststrpType> types = wriststrpTypeService.listAll();
		// 将结果填充至封装内
		result.setData(types);
		// 设置数据码
		result.setCode(0);
		return result;
	}
	
	/**
	 * 用于访问跳转
	 * @return
	 */
	@RequestMapping("/show")
	public ModelAndView show() {
		// 访问本请求，跳转至腕带类型管理页面
		return new ModelAndView("lsy/wriststrpType");
	}
	
	
	/**
	 * 解析消费项字符串
	 * @param itemstr eg:@param a,b,c @return [a,b,c]
	 * @return 消费项的数组
	 */
	private List<ConsumerItem> consumerItemHandler(String itemstr) {
		// 创建结果对象
		List<ConsumerItem> items = new ArrayList<>();
		// 判断执行是否为null或空字符
		if(itemstr == null||itemstr.equals("")) {
			return items;
		}
		// 拆分字符串
		String[] strs = itemstr.split(",");
		// 遍历添加赋值
		for (int i = 0; i < strs.length; i++) {
			items.add(new ConsumerItem(Integer.parseInt(strs[i]), null, null, null));
		}
		return items;
	}
	
	/**
     * 控制器统一异常处理器
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public TableDataDto<Integer> resolveException(Exception e){
    	// 创建对象
    	TableDataDto<Integer> result = new TableDataDto<>();
    	// 设置参数
    	result.setMsg("操作异常，请联系管理员");
    	// 记录日志
    	log.error("WriststrpTypeController发生严重异常："+e.getMessage()+e);
    	// 设置状态
		result.setCode(4);
    	return result;
    }
}
